文本特征工程之词袋模型

您所在的位置:网站首页 be fit for近义词 文本特征工程之词袋模型

文本特征工程之词袋模型

2023-03-31 01:36| 来源: 网络整理| 查看: 265

学习词袋模型要抓住两个重点,第一个重点是词袋是一张由训练语料得到的词汇表(词典),第二个重点是给出一篇文本后,通过计算词汇表中每个词语的数值来表示文本。对于词汇表而言,通常在机器分词后就自然而然得到了。对于计算词语的数值,有三种计算规则,包括独热(One-Hot)法、词频法(TF)和词频-逆文档频率法(TF-IDF)。

1. 词袋模型和表示方法1.1 独热表示法(One-Hot)

One-Hot表示法的数值计算规则为:词语序列中出现的词语其数值为1,词语序列中未出现的词语其数值为0。用数学式子表达W_j=\left\{ \begin{matrix} 1,文本含有词项j \\ 0,文本不含词项j \end{matrix} \right. \\ 例1 已知有下边的几篇英文文本,请用词袋模型One-Hot法向量化表示每篇文本。

文档ID文档词列表1Chinese Beijing Chinese2Chinese Chinese Shanghai3Chinese Macao4Tokyo Japan Chinese

步骤:(1)构建词袋

BeijingChineseJapanMacaoShanghaiTokyo

(2)对于每一篇文本,按照One-Hot表示法,计算词袋中各词语的数值,得到该篇文本的向量。

Chinese Beijing Chinese的词向量为:

BeijingChineseJapanMacaoShanghaiTokyo110000

Chinese Chinese Shanghai的词向量为:

BeijingChineseJapanMacaoShanghaiTokyo010010

Chinese Macao的词向量为:

BeijingChineseJapanMacaoShanghaiTokyo010100

Tokyo Japan Chinese的词向量为:

BeijingChineseJapanMacaoShanghaiTokyo011001

从以上的介绍可以看出,词袋模型的One-Hot表示法考虑了哪些词在文本中出现,用出现的词语来表示文本的语义。

1.2 词频表示法(Term Frequency, TF)

TF表示法的数值计算规则为:词语序列中出现的词语其数值为词语在所在文本中的频次,词语序列中未出现的词语其数值为0。用数学式子表达为:

W_j=\left\{ \begin{matrix} count(t_j),文本含有词项j \\ 0,文本不含词项j \end{matrix} \right. \\ 其中, t_j 表示词语j, count(t_j) 表示词语j在所在文本出现的次数。

例2 已知有以下几篇英文文本,请用词袋模型TF法向量化表示每篇文本。文本内容同例1

步骤:(1)构建词袋

BeijingChineseJapanMacaoShanghaiTokyo

(2)对于每一篇文本,按照词频表示法,计算词袋中各词语的数值,得到该篇文本的向量。

Chinese Beijing Chinese的词向量为:

BeijingChineseJapanMacaoShanghaiTokyo120000

Chinese Chinese Shanghai的词向量为:

BeijingChineseJapanMacaoShanghaiTokyo020010

Chinese Macao的词向量为:

BeijingChineseJapanMacaoShanghaiTokyo010100

Tokyo Japan Chinese的词向量为:

BeijingChineseJapanMacaoShanghaiTokyo011001

从以上回答可以看出,词袋模型的词频表示法除了考虑都有哪些词在文本中出现外,还考虑了词语出现的频次,用出现词语的频次突出文本主题进而表示文本的语义。

1.3 词频-逆文档频率表示法(TF-IDF)

TF-IDF表示法的数值计算规则为:词语序列中出现的词语其数值为词语在所在文本中的频次乘以词语的逆文档频率,词语序列中未出现的词语其数值为0。TF-IDF的核心思想是:如果某个词语在文本中频繁的出现,说明该词语很重要,但是如果该词语在每篇文档都出现,又说明该词语不是那么重要,比如“的”字几乎每篇文章都出现,但是没啥意义。TF-IDF用数学表达为:

W_j=\left\{ \begin{matrix} count(t_j) \times idf(t_j),文本含有词项j \\ 0,文本不含词项j \end{matrix} \right. \\ 非平滑版: idf(t_j) = 1 + In \frac {训练集文本数} {训练集中包含词项t_j 的文本数}

平滑版: idf(t_j) = 1 + In \frac {训练集文本数+1} {训练集中包含词项t_j 的文本数+1}

例3 已知有下边的几篇英文文本,请用词袋模型TF-IDF法向量化每篇文本。文本同例1

步骤:(1)构建词袋并计算词语的IDF值

BeijingChineseJapanMacaoShanghaiTokyo

IDF计算过程如下:

idf(Beijing)=1+In \frac {4}{1}=2.386, idf(Beijing)=1+In \frac {4+1}{1+1}=1.916

idf(Chinese)=1+In \frac {4}{4}=1, idf(Chinese)=1+In \frac {4+1}{4+1}=1

idf(Japan)=1+In \frac {4}{1}=2.386, idf(Japan)=1+In \frac {4+1}{1+1} = 1.916

idf(Macao) = 1+In {4}{1}=2.386, idf(Macao)=1+In \frac {4+1}{1+1}=1.916

idf(Shanghai)=1+In \frac {4}{1}=2.386, idf(Shanghai) = 1+In \frac {4+1}{1+1}=1.916

idf(Tokyo) = 1+ In \frac {4}{1}=2.386, idf(Tokyo)=1+In \frac {4+1}{1+1}=1.916

(2)对于每一篇文本,按照TF-IDF表示法,计算词袋中各词语的数值,得到该篇文本的向量。

Chinese Beijing Chinese的词向量为:

BeijingChineseJapanMacaoShanghaiTokyo非平滑1*2.386=2.3862*1=2平滑1*1.916=1.9162*1=2

Chinese Chinese Shanghai的词向量为:

BeijingChineseJapanMacaoShanghaiTokyo非平滑02*1=2001*2.386=2.3860平滑02*1=2001*1.916=1.9160

Chinese Macao的词向量为:

BeijingChineseJapanMacaoShanghaiTokyo非平滑01*1=101*2.386=2.38600平滑01*1=101*1.916=1.91600

Tokyo Japan Chinese的词向量为:

BeijingChineseJapanMacaoShanghaiTokyo非平滑01*1=11*2.386=2.386001*2.386=2.386平滑01*1=11*2.386=2.386001*1.916=1.916

从以上介绍可以看到,词袋模型的TF-IDF表示法除了考虑都有哪些词在文本中出现外,还考虑了词语出现的频次以及词语在所有文本上的频率倒数。用出现词语的频次来突出文本主题,用出现词语的逆文档频率来突出文档的独特性,进而表示文本的语义。

2. 常见疑问解答2.1 任何分类模型都需要文本向量化表示吗?

不是的。朴素贝叶斯模型不需要将文本向量化表示。因为朴素贝叶斯模型记录的是词语的条件概率值,只要对输入各词语的条件概率值进行计算即可得到预测数值。线性分类模型需要对文本进行向量化表示。因为线性模型记录的是线性表达式系数,必须输入一个数值向量才能计算得到预测数值。

2.2 向量化表示与特征选择的关系是什么?

文本的向量化表示是用数值来表达文本语义的,这一过程中会引入失真,也就是失去文本的主题。虽然One-Hot、TF、TF-IDF一步步减少失真突出文本主题,但是依然不够,因此可以借助特征选择方法筛选出对于区分类别主题有帮助的词语。

2.3 词袋模型与词嵌入模型的对比

词袋模型使用一组词语序列来表示一段文本,这一组词语序列就是词袋模型,也可以叫词汇表。词汇表中每个词语之间的顺序是任意的,但是一旦词汇表确定后词语之间的前后顺序就不能变化了。由于词语之间的顺序任意,所以词袋模型忽略了文本的语法和语序要素。词袋模的One-Hot表示法、TF表示法、TF-IDF表示法的数值计算规则都没有考虑词语之间的共现关系。比如“的”字的后边只能接名词性词语,“地”字的后边只能接动词性词语。显然词袋模型无法表示词语之间的共现关系,也就是说词袋模型认为一个词出现的可能性与其他词出现的可能性无关,词语的出现是相互独立的。词袋模型最大的缺陷是向量的维度高,维度高造成了后续相似度或者文本分类的计算量非常大,同时数据稀疏也导致了相似度区分不明显。由于词袋模型表示的文本向量的每个维度都代表一个词语,因此可以用聚类后簇中心向量的具有较大值的维度对应的词语来作为簇的关键词。词嵌入模型是浅层神经网络的副产品,在用浅层神经网络做文本分类时,发现在得到分类结果的同时,输入矩阵刚好可以用来表示词语,由于词语是用上下文来表达的,因此在一定程度上反映了词语的语义,但这并不是机器真正明白了词语的意义,而只是相似的词语之间向量相似度大而已。它的优点:1.不需要人工参与可以得到,大厂推出了各种词向量库,词汇量一般都是百万级。2.可以表达一个词语的向量,这是前几年办不到的。3. 文本的表示维度降下来了,一般只需100到300维之间。缺点也很明显:1.强烈依赖分词特别是未登录词识别技术,也就是说新出现的词没有对应向量。2.不是真正明白词语意思,对一词多义无能为力,只能表达最通用的语义。3.有些词在语义上没有近义关系,但因为经常出现在相同的上下文中,向量的相似度也很大。有些概念抽象的词(特别时文本类别名称词),按照相似度检索到的近义词之间不具有语义相关性。4. 每个维度不再对应一个特征词语,后续排查分类badcase时不方便。

3. 代码示例

Sklearn的特征抽取模块可以从原始数据中抽取特征。目前该模块提供了图像和文本特征抽取类。文本的特征抽取类可以从原始文本中抽取出词语特征,特征数据格式满足所有机器学习算法对输入数据格式的要求。请注意特征抽取与特征选择的区别。特征抽取是将文本数据转换成适合机器学习的数值特征而特征选择是一种应用于数值特征的机器学习技术。

3.1 英文语料向量化import numpy as np import pandas as pd import jieba from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extraction.text import TfidfVectorizer # 加载语料 text = ['Chinese Beijing Chinese', 'Chinese Chinese Shanghai', 'Chinese Macao', 'Tokyou Japan Chines'] # 独热法(One-Hot) cv = CountVectorizer(binary=True) document_vec = cv.fit_transform(text) cv.get_feature_names_out() print("独热法:", document_vec.toarray()) # 词频法(Term Frequency,TF) cv = CountVectorizer() document_vec = cv.fit_transform(text) print("词频法:", document_vec.toarray()) # TF-IDF法 # 未平滑 tv = TfidfVectorizer(use_idf=True, smooth_idf=False, norm=None) tv_fit = tv.fit_transform(text) print(tv.get_feature_names_out()) print("TF-IDF(未平滑):", tv_fit.toarray()) # 平滑 tv = TfidfVectorizer(use_idf=True, smooth_idf=True, norm=None) tv_fit = tv.fit_transform(text) print("TF-IDF:", tv_fit.toarray())3.2 中文语料向量化# 中文代码 import numpy as np import pandas as pd import jieba from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extraction.text import TfidfVectorizer from cntext.dictionary import STOPWORDS_zh # 加载停用词表 stop_words = STOPWORDS_zh text_list = [ '详细了解园区规划,走访园区', '要坚持规划先行,立足高起点', '要增强集聚功能,集聚产业', '技术研发到药品生产的完整产业链条', ] text_list = [[word for word in jieba.cut(sent) if word not in stop_words] for sent in text_list] # jieba中文分词并剔除停用词 # 将中文语料转为英文空格形式 # 由于英文单词之间存在空格,所以可以直接进行分词 # 中文词语之间不存在空格,所以需要转化为英文形式,否则无法处理 text = [' '.join(sent) for sent in text_list] print(text) # 独热法(One-Hot) cv = CountVectorizer(binary=True) document_vec = cv.fit_transform(text) cv.get_feature_names_out() print("独热法:", document_vec.toarray()) # 词频法(Term Frequency,TF) cv = CountVectorizer() document_vec = cv.fit_transform(text) print("词频法:", document_vec.toarray()) # TF-IDF法 # 未平滑 tv = TfidfVectorizer(use_idf=True, smooth_idf=False, norm=None) tv_fit = tv.fit_transform(text) print(tv.get_feature_names_out()) print("TF-IDF(未平滑):", tv_fit.toarray()) # 平滑 tv = TfidfVectorizer(use_idf=True, smooth_idf=True, norm=None) tv_fit = tv.fit_transform(text) print("TF-IDF:", tv_fit.toarray())

参考:文本向量化表示——词袋模型 - 知乎 (zhihu.com)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3